#include "trap.h"
    .set noreorder        # 禁止指令重排序
    .set nomacro          # 禁止伪指令使用
    .set noat             # 禁止保留寄存器$at使用
    .globl main
    .text

main: 
    # 初始化高位地址到$at寄存器，并构造完整的32位值
    lui     $at, 0x1234        
    ori     $at, $at, 0xABCD   

    # 设置$v0寄存器为0x1230ABCD
    lui     $v0, 0x1230        
    ori     $v0, $v0, 0xABCD   

    # 计算$at和$v0的差值，存储到$v1
    subu    $v1, $at, $v0      

    # 执行乘法操作，并将高位和低位分别存储到$a0和$a1
    mult    $v0, $v1           
    mfhi    $a0                
    mflo    $a1                

    # 初始化常数值
    addi    $t2, $zero, 0x4       # $t2 = 4
    addi    $t3, $zero, 0x3000    # $t3 = 0x3000

    # 设置高位立即数寄存器
    lui     $t0, 0x7FFF           # $t0 = 0x7FFF0000
    lui     $t1, 0x8100           # $t1 = 0x81000000
    lui     $s1, 0x7FFF           # $s1 = 0x7FFF0000

    # 构造完整32位值并进行计算
    ori     $s1, $s1, 0xFFFF      # $s1 = 0x7FFFFFFF
    addi    $t0, $t0, 0x7FFF      # $t0 = 0x7FFF7FFF
    addi    $t1, $t1, 0x8000      # $t1 = 0x80FF8000

    # 触发负溢出异常
    addiu   $s3, $t1, 0x8000      # $s3 = 0x80FF0000 (负溢出)

    # 触发正溢出异常
    addiu   $s2, $s1, 0x2         # $s2 = 0x80000001 (正溢出)

    # 比较指令测试
    slti    $s4, $t1, 0xFF        # 小于符号立即数
    sltiu   $s5, $t1, 0xFF        # 小于无符号立即数
    slti    $s6, $s1, 0xFF        # 对$s1符号比较
    sltiu   $s7, $s1, 0xFF        # 对$s1无符号比较

    # 按位与测试
    andi    $t2, $t0, 0x8000      # $t2 = $t0 & 0x8000
    andi    $t3, $t1, 0x1000      # $t3 = $t1 & 0x1000

    # 异或测试
    xori    $t4, $s0, 0x8         # $t4 = $s0 ^ 0x8
    xori    $t5, $s1, 0x0         # $t5 = $s1 ^ 0x0

    # 初始化新的常数值
    addi    $t0, $zero, 0x3       # $t0 = 3
    addi    $t1, $zero, 0x4       # $t1 = 4

    # 结束测试程序
    HIT_GOOD_TRAP                 # 停止模拟器